/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// TGUI - Texus's Graphical User Interface
// Copyright (C) 2012 Bruno Van de Velde (VDV_B@hotmail.com)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it freely,
// subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented;
//    you must not claim that you wrote the original software.
//    If you use this software in a product, an acknowledgment
//    in the product documentation would be appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such,
//    and must not be misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source distribution.
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


#ifndef _TGUI_SCROLLBAR_INCLUDED_
#define _TGUI_SCROLLBAR_INCLUDED_

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

namespace tgui
{
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    struct TGUI_API Scrollbar : public Slider
    {
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Default constructor
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        Scrollbar();


        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Copy constructor
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        Scrollbar(const Scrollbar& copy);


        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Destructor
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ~Scrollbar();


        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Overload of assignment operator
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        Scrollbar& operator= (const Scrollbar& right);


        //////////////////////////////////////////////////////////////////////////////////////////////////////
        /// The path to the folder that contains the images.
        /// The folder must also contain an info.txt file, which will give more information about the checkbox.
        /// 'verticalScroll' might be changed in this function. If you want to change it then do it afterwards.
        //////////////////////////////////////////////////////////////////////////////////////////////////////
        bool load(const std::string pathname);


        //////////////////////////////////////////////////////////////////////////////////////////////////////
        /// This function is overridden from Slider so that the minimum can't be changed.
        ///The minimum will always stay 0.
        //////////////////////////////////////////////////////////////////////////////////////////////////////
        void setMinimum(unsigned int minimum);


        //////////////////////////////////////////////////////////////////////////////////////////////////////
        /// This function is overridden from Slider because the value has a different maximum limit.
        //////////////////////////////////////////////////////////////////////////////////////////////////////
        void setValue(unsigned int value);


        //////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Changes the 'low value'. Until the maximum is bigger than this value, no scrollbar will be drawn.
        /// You can however choose to always draw the scrollbar by setting autoHide to false.
        /// In e.g. a listbox, this value is the amount of items that fit inside the listbox.
        //////////////////////////////////////////////////////////////////////////////////////////////////////
        void setLowValue(unsigned int lowValue);


        //////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Returns the low value. Until the maximum is bigger than this value, no scrollbar will be drawn.
        /// In e.g. a listbox, this value is the amount of items that fit inside the listbox.
        //////////////////////////////////////////////////////////////////////////////////////////////////////
        unsigned int getLowValue();


        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // These functions are used to receive callback from the EventManager.
        // You normally don't need them, but you can use them to simulate an event.
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        bool mouseOnObject(float x, float y);
        void leftMousePressed(float x, float y);
        void leftMouseReleased(float x, float y);
        void mouseMoved(float x, float y);


        //////////////////////////////////////////////////////////////////////////////////////////////////////
    private:

        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // Because this struct is derived from sf::Drawable, you can just call the draw function from your sf::RenderTarget.
        // This function will be called and it will draw the scrollbar on the render target.
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        void draw(sf::RenderTarget& target, sf::RenderStates states) const;


        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    public:

        /// When true (default), the scrollbar will not be drawn when the maximum is below the low value.
        bool autoHide;


        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    private:

        // Maximum should be above this value before the scrollbar is needed
        unsigned int m_LowValue;

        sf::Texture* m_TextureArrowNormal;
        sf::Texture* m_TextureArrowHover;

        sf::Sprite   m_SpriteArrowNormal;
        sf::Sprite   m_SpriteArrowHover;


        // Listbox, ComboBox and TextBox can access the scrollbar directly
        friend struct Listbox;
        friend struct ComboBox;
        friend struct TextBox;

        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    };

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#endif //_TGUI_SCROLLBAR_INCLUDED_
